package com.ingweb.inventarius.impl;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import com.ingweb.inventarius.dao.DAOProducto;
import com.ingweb.inventarius.model.Producto;

/***
 * 
 * 
 * Clase que implementa los metodos de la interfaz DAOProducto
 * 
 * @see DAOProducto
 *
 */
public class DAOProductoImpl implements DAOProducto {

	private static Logger logger = Logger.getLogger(DAOProductoImpl.class);

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ingweb.hibernate.dao.DAOProducto#obtenerProductos()
	 */
	@Override
	public List<Producto> obtenerProductos() {
		Session session = HibernateUtil.getSessionFactory().openSession();
		List<Producto> encontrados = new ArrayList<Producto>();

		try {
			encontrados = session.createQuery("from Producto").list();
		} catch (HibernateException ex) {
			logger.debug("Exception encontrada " + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

		return encontrados;
	}

	@Override
	public Producto obtenerProducto(int codigo) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Producto encontrado = null;

		try {
			encontrado = (Producto) session.get(Producto.class, codigo);
		} catch (HibernateException ex) {
			logger.debug("Exception encontrada" + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

		return encontrado;
	}

	@Override
	public void guardarProducto(Producto producto) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		try {
			session.save(producto);
			session.getTransaction().commit();

		} catch (HibernateException ex) {
			logger.debug("Exception encontrada" + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

	}

	@Override
	public void eliminarProducto(Producto producto) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		try {
			session.delete(producto);
			session.getTransaction().commit();
		} catch (HibernateException ex) {
			logger.debug("Exception encontrada" + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

	}

	@Override
	public void editarProducto(Producto producto) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		session.beginTransaction();

		try {
			session.merge(producto);
			session.getTransaction().commit();
		} catch (HibernateException ex) {
			logger.debug("Exception encontrada" + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

	}

	@Override
	public List<Producto> buscarProducto(String cadena) {
		Session session = HibernateUtil.getSessionFactory().openSession();
		Criteria criteria = session.createCriteria(Producto.class);
		List<Producto> encontrados = new ArrayList<Producto>();

		try {
			criteria.add(Restrictions.like("nombre", "%" + cadena + "%"));
			encontrados = criteria.list();
		} catch (HibernateException ex) {
			logger.debug("Exception encontrada" + ex.getLocalizedMessage());
		} finally {
			session.close();
		}

		return encontrados;
	}

}